home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
Libraries
/
CW GUSI 1.6.4
/
Examples
/
GUSIPPCTest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-26
|
4KB
|
192 lines
/*********************************************************************
File : GUSI - Grand Unified Socket Interface
File : GUSIPPCTest - Test PPC sockets
Author : Matthias Neeracher <neeri@iis.ethz.ch>
Language : MPW C
$Log: GUSIPPCTest.c,v $
Revision 1.2 1994/12/31 01:05:05 neeri
ANSIfy (omitting parameter names was illegal).
Revision 1.1 1994/02/25 02:47:36 neeri
Initial revision
Revision 0.3 1993/06/20 00:00:00 neeri
New sa_constr
Revision 0.2 1992/10/14 00:00:00 neeri
Fix NBP type, usage messages
Revision 0.1 1992/09/08 00:00:00 neeri
Factor out common socket routines
*********************************************************************/
#include <GUSI.h>
#include "GUSITest.h"
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <Events.h>
#include <TextUtils.h>
#include <PLStringFuncs.h>
extern int GUSIDefaultSpin(spin_msg, long);
sa_constr_ppc Constr = {
PPC_CON_NEWSTYLE+PPC_CON_MATCH_TYPE,
"\p",
{
smRoman,
"\p",
ppcByString,
"\pGUSIPPCTest"
}
};
void Socket(char ch1, char ch2, const char * line)
{
sock = socket(AF_PPC, SOCK_STREAM, 0);
if (sock == -1) {
printf("# socket() returned error %s\n", Explain());
Where();
}
}
void Bind(char ch1, char ch2, const char * cmd)
{
struct sockaddr_ppc addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
addr.family = AF_PPC;
addr.port.nameScript = smRoman;
addr.port.portKindSelector = ppcByString;
addr.location.locationKindSelector = ppcNBPTypeLocation;
if (sscanf(cmd, "%s %s", ((char *)addr.port.name)+1, ((char *)&addr.location.u.nbpType)+1) != 2) {
Usage(ch1, ch2);
return;
}
addr.port.name[0] = strlen(((char *)addr.port.name)+1);
addr.location.u.nbpType[0] = strlen(((char *)&addr.location.u.nbpType)+1);
PLstrcpy((StringPtr) &addr.port.u.portTypeStr, "\pGUSIPPCTest");
if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc))) {
printf("bind() returned error %s\n", Explain());
Where();
}
}
void Accept(char ch1, char ch2, const char * line)
{
int len;
struct sockaddr_ppc addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
if (accsock != -1) {
printf("# can't accept more than one connection\n");
Where();
return;
}
len = sizeof(struct sockaddr_ppc);
sock = accept(accsock = sock, (struct sockaddr *) &addr, &len);
if (sock < 0) {
printf("# accept() returned error %s\n", Explain());
sock = accsock;
accsock = -1;
} else {
addr.port.name[addr.port.name[0]+1] = 0;
addr.port.u.portTypeStr[addr.port.u.portTypeStr[0]+1] = 0;
printf(
"# accepted connection from %s[%s]",
((char *)addr.port.name)+1,
((char *)addr.port.u.portTypeStr)+1);
switch (addr.location.locationKindSelector) {
case ppcNBPLocation:
addr.location.u.nbpEntity.objStr[addr.location.u.nbpEntity.objStr[0]+1] = 0;
addr.location.u.nbpEntity.typeStr[addr.location.u.nbpEntity.typeStr[0]+1] = 0;
addr.location.u.nbpEntity.zoneStr[addr.location.u.nbpEntity.zoneStr[0]+1] = 0;
printf(
"@%s:%s:%s\n",
((char *)addr.location.u.nbpEntity.objStr)+1,
((char *)addr.location.u.nbpEntity.typeStr)+1,
((char *)addr.location.u.nbpEntity.zoneStr)+1);
break;
case ppcNBPTypeLocation:
addr.location.u.nbpType[addr.location.u.nbpType[0]+1] = 0;
printf("@%s\n", ((char *)addr.location.u.nbpType)+1);
break;
default:
printf("\n");
break;
}
}
Where();
}
void Connect(char ch1, char ch2, const char * cmd)
{
int len;
struct sockaddr_ppc addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
len = sizeof(struct sockaddr_ppc);
if (choose(AF_PPC, 0, "Yeah ?", &Constr, 0, &addr, &len)) {
printf("# choose() returned error %s\n", Explain());
Where();
return;
}
if (connect(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc))) {
printf("# connect() returned error %s\n", Explain());
Where();
}
}
main(int argc, char ** argv)
{
GUSISetup(GUSIwithSIOUXSockets);
GUSISetup(GUSIwithPPCSockets);
printf("GUSIPPCTest MN 10Jun94\n\n");
COMMAND('s', 's', Socket, "", "Create a stream socket");
COMMAND('b', 'd', Bind, "Name Type", "Bind to address");
COMMAND('c', 'o', Connect, "", "Connect to address");
COMMAND('a', 'c', Accept, "", "Accept a connection");
AddSocketCommands();
RunTest(argc, argv);
CleanupSockets();
}